package com.canaan.business.service.agv;

import com.canaan.business.common.enums.agv.AgvEnum;
import com.canaan.business.domain.agv.AgvTaskDispatch;
import com.canaan.business.domain.basic.WmsStorehouseLocation;
import com.canaan.business.domain.vo.AgvCreateTaskVo;
import com.canaan.business.domain.vo.AgvResultVo;
import com.canaan.business.domain.vo.AgvTaskCallbackVo;
import com.canaan.business.domain.vo.BillAgvVo;
import com.canaan.common.core.domain.AjaxResult;
import com.canaan.common.core.domain.R;

import java.util.List;

/**
 * AGV任务调度Service接口
 *
 * @author
 * @date 2023-03-02
 */
public interface IAgvTaskDispatchService {
    /**
     * 查询AGV任务调度
     *
     * @param id AGV任务调度主键
     * @return AGV任务调度
     */
    AgvTaskDispatch selectAgvTaskDispatchById(Long id);

    /**
     * 查询AGV任务调度列表
     *
     * @param agvTaskDispatch AGV任务调度
     * @return AGV任务调度集合
     */
    public List<AgvTaskDispatch> selectAgvTaskDispatchListOrderByIdDesc(AgvTaskDispatch agvTaskDispatch);

    /**
     * 查询AGV任务调度列表
     *
     * @param agvTaskDispatch AGV任务调度
     * @return AGV任务调度集合
     */
    List<AgvTaskDispatch> selectAgvTaskDispatchList(AgvTaskDispatch agvTaskDispatch);
    /**
     * 查询AGV起点有未出库任务
     *
     * @param startPoint 终点库位
     * @return AGV任务调度集合
     */
    List<AgvTaskDispatch> selectAgvTaskDispatchListByStartPoint(String startPoint);

    List<AgvTaskDispatch> selectAgvTaskDispatchListByTrayNo(String trayNo);
    /**
     * 查询AGV任务调度列表
     *
     * @param endPoint 终点库位
     * @return AGV任务调度集合
     */
    List<AgvTaskDispatch> selectAgvTaskDispatchListByEndPoint(String endPoint);

    /**
     * 新增AGV任务调度
     *
     * @param agvTaskDispatch AGV任务调度
     * @return 结果
     */
    int insertAgvTaskDispatch(AgvTaskDispatch agvTaskDispatch);

    /**
     * 批量新增AGV任务调度
     *
     * @param agvTaskDispatchList AGV任务调度列表
     * @return 结果
     */
    int batchInsertAgvTaskDispatch(List<AgvTaskDispatch> agvTaskDispatchList);

    /**
     * 修改AGV任务调度
     *
     * @param agvTaskDispatch AGV任务调度
     * @return 结果
     */
    int updateAgvTaskDispatch(AgvTaskDispatch agvTaskDispatch);

    /**
     * 批量修改AGV任务调度
     *
     * @param agvTaskDispatchList AGV任务调度列表
     * @return 结果
     */
    int batchUpdateAgvTaskDispatch(List<AgvTaskDispatch> agvTaskDispatchList);

    /**
     * 批量删除AGV任务调度
     *
     * @param ids 需要删除的AGV任务调度主键集合
     * @return 结果
     */
    int deleteAgvTaskDispatchByIds(Long[] ids);

    /**
     * 删除AGV任务调度信息
     *
     * @param id AGV任务调度主键
     * @return 结果
     */
    int deleteAgvTaskDispatchById(Long id);

    /**
     * AGV任务回调
     *
     * @param vo 任务回调实体
     * @return AgvDispatchResponse
     */
    AgvResultVo agvCallback(AgvTaskCallbackVo vo);

    /**
     * 发送agv指令给小车
     *
     * @param vo
     */
    boolean sendAgvSchedulingTask(AgvCreateTaskVo vo);

    /**
     * 取消任务
     *
     * @param id 任务id
     * @return com.canaan.common.core.util.R
     */
    R cancelTask(Long id);
    /**
     * 根据任务编号取消任务
     *
     * @param no 任务no
     * @return com.canaan.common.core.util.R
     */
    R cancelTaskByNo(String no);

    /**
     * 根据任务编号查询状态
     *
     * @param no 任务no
     * @return com.canaan.common.core.util.R
     */
    AgvTaskDispatch getTaskByNo(String no);

    /**
     * 根据taskDispatch发送小车指令
     *
     * @param sendDispatch 任务调度数据
     */
    boolean sendSchedulingTaskByAgvDispatch(AgvTaskDispatch sendDispatch);

    /**
     * 根据批量发送rcs创建AGV任务
     *
     * @param dispatchList 任务调度数据
     */
    boolean sendRcsTaskList(List<AgvTaskDispatch> dispatchList);

    /**
     * 创建AGV任务
     * @param billNo 单据号
     * @param source 源库位
     * @param dest 目标库位
     * @return true-成功,false-失败
     */
    void createTaskDispatch(String billNo, WmsStorehouseLocation source, WmsStorehouseLocation dest, AgvEnum.TASK_TYPE taskType,String shelfNo,String trayNo);

    /**
     * AGV手动完成回调
     * @param vo
     * @return
     */
    AgvResultVo finishAgvCallback(BillAgvVo vo);

    /**
     * 有货架正在执行的任务数
     * @param containerNo
     * @return
     */
    int queryRunningTaskByShelfNo(String containerNo);

    /**
     * 有托盘正在执行的任务数
     * @param trayNo
     * @return
     */
    int queryRunningTaskByTrayNo(String trayNo);

    /**
     * AGV调库任务
     *
     * @param sendDispatch
     * @return
     */
    AjaxResult transferShelf(AgvTaskDispatch sendDispatch);


}
